/**
 * @Author: china-fanxin
 * @Website: https://fan-xin.cn
 * @Date: 2022/11/19 16:45
 * @Description:
 */

import cn.fanxin.enums.ConstantEnum;
import cn.fanxin.service.ParseModeService;
import cn.fanxin.tools.*;
import com.mysql.jdbc.StringUtils;

import java.util.HashMap;
import java.util.Properties;
import java.util.Set;


@SuppressWarnings("AlibabaClassNamingShouldBeCamel")
public class parseIndicatorService {

    /**
     * @Author: china-fanxin
     * @Website: https://fan-xin.cn
     * @Description:
     * @Date: 2022/11/19 17:26
     * @Param: [args]
     * @return: void
     */
    public static void main(String[] args) {

        //配置文件路径变量初始化
        String configFilePath;
        //配置文件内容变量初始化
        Properties confProp;
        //指标编码初始化
        String kpiCode;
        //账期变量初始化
        String acctDate;
        //解析模式选项
        String mode;

        //打印欢迎欢迎Banner
        CommonPrint.printWelcome();

        /**
         * 根据输入参数，初始化调度配置信息
         */
        try {
            //获取配置文件存放路径
            configFilePath = args[0];
            //获取指标编码
            kpiCode = args[1];
            //获取账期参数
            acctDate = args[2];
            //获取解析程序执行模式
            mode = args[3];
        }catch (ArrayIndexOutOfBoundsException e){
            throw new MyException("调度方式出错：请检查参数个数！！");
        }

        /*
         * 读取配置文件内容，获取程序运行必要配置参数
         */
        confProp= CommonTool.loadConfigInfo(configFilePath);

        //读取KPI_CODE对应的配置信息
        HashMap<String, String> kpiConfMap = CommonFun.getKpiConf(confProp, kpiCode);
        kpiConfMap.replaceAll((k,v)->{
            if (StringUtils.isNullOrEmpty(kpiConfMap.get(k))||kpiConfMap.get(k).trim().isEmpty()||!(kpiConfMap.get(k) instanceof String)){
                return v;
            }
            return CommonFun.replaceDefDate(acctDate,v);
        });

        //指标解析前配置检测
        if ("6".equals(mode)){
            CommonCheck.checkMcBaseAll(acctDate,kpiConfMap,confProp);
        }else {
            CommonCheck.checkBaseAll(acctDate,kpiConfMap,confProp);
        }

        //定义生成可执行语句的文件路径
        ConstantEnum.EXECUTE_SQL_PATH.setValue("/data1/fx/sql/execute_" + acctDate + "_"+ kpiCode + "_tmp.sql");
        //定义MC执行查询语句输出的当前账期指标值结果集
        ConstantEnum.OUTPUT_FILE_PATH.setValue("/data1/fx/out/execute_" + acctDate + "_"+ kpiCode + "_tmp.csv");
        //定义ADB入库前需要执行的删除历史数据执行语句
        ConstantEnum.DELETE_SQL_PATH.setValue("/data1/fx/sql/delete_"+ acctDate + "_"+ kpiCode + "_tmp.sql");
        //定义MC的多维指标加工临时表DDL生成语句
        ConstantEnum.GEN_DDL_SQL_PATH.setValue("/data1/fx/sql/gen_ddl_"+ acctDate + "_"+ kpiCode + "_tmp.sql");
        //定义MC的多维指标加工临时表DDL语句
        ConstantEnum.DDL_SQL_PATH.setValue("/data1/fx/sql/ddl_"+ acctDate + "_"+ kpiCode + "_tmp.sql");
        //定义解析加工日志存储路径
        ConstantEnum.EXECUTE_LOG_PATH.setValue("/data1/fx/log/execute_"+ acctDate + "_"+ kpiCode + "_tmp.log");

        //根据调度参数使用的解析模式，生成不同的可执行语句
        switch(mode){
            case "1":
                if (kpiCode.contains("DCKP")){
                    ParseModeService.parseIndicatorByMode1Multi(acctDate,kpiConfMap,confProp);
                }else {
                    ParseModeService.parseIndicatorByMode1(acctDate,kpiConfMap,confProp);
                }
                break;
            case "2":
                ParseModeService.parseIndicatorByMode2(acctDate,kpiConfMap,confProp);
                break;
            case "3":
                ParseModeService.parseIndicatorByMode3(acctDate,kpiConfMap,confProp);
                break;
            case "4":
                ParseModeService.parseIndicatorByMode4(acctDate,kpiConfMap,confProp);
                break;
            case "5":
                ParseModeService.parseIndicatorByMode5(acctDate,kpiConfMap,confProp);
                break;
            case "6":
                ParseModeService.parseIndicatorByMode6(acctDate,kpiConfMap,confProp);
                break;
            default:
                throw new MyException("ERROR：调度参数第三位的调度模式不存在，解析程序执行模式: mode参数介绍：\n" +
                        "1 ： 解析配置文件生成当前账期SQL查询语句 （MC加工当期值，以文件形式导入adb的中间表）\n" +
                        "2 ： 解析配置文件生成当前账期SQL查询语句（adb加工当期值，直接插入adb的中间表）\n" +
                        "3 ： 依赖指标中间表本身具备的当期值，生成带有衍生值的SQL查询语句（带有 INSERT INTO）");
        }

    }
}